<?php
/**
 * Módulo base para adodb_lite, para acceder a ciertas funciones básicas
 * como pueden ser insertar en una base de datos, editar una tabla, etc...
 * sin tener que ejecutar todo el código, simplemente haciendo una llamada
 * a estas simples funciones
 * @package: adodb_lite
 * @author: meth < mth at mthweb dot org >
 * @date: 30 April 2007
 */

eval('class base_EXTENDER extends ' . $last_module . '_ADOConnection { }');

class base_ADOConnection extends base_EXTENDER{
    /**
     * Función que inserta datos en una tabla, se le pasa una matriz
     * que contiene los datos a insertar en la tabla,tomando como
     * campos de la tabla los índices de la matriz, y los valores de la
     * matriz como los valores de dichos campos
     * @param string Nombre de la tabla de la base de datos
     * @param array Matriz con los datos que serán insertados en la tabla
     * @return int El id generado por el sql al insertar el registro en la tabla
     * o false si hubo algún error
     * @access public
     */
    function insert($tabla='',$datos=array()){
        if(is_array($datos) && $datos != ''){
            $valores = '';
            $limit = count($datos);
            for($i=0;$i<$limit;$i++){
                if($valores === '') $valores = '?';
                else $valores .= ',?';
            }
            $this->Execute('INSERT INTO '.$tabla.' (`'.implode("`, `",array_keys($datos)) .'`) VALUES ('.$valores.')',array_values($datos));
            if($this->Insert_ID()) return $this->Insert_ID();
            else return false;
        }
        else return false;
    }//FIN insert

    /**
     * Función que actualiza todos los campos de un registro en la base de datos
     * los datos a actualizar son pasados mediante una matriz
     * @param string Nombre de la tabla a actualizar
     * @param int Id del registro que hay que actualizar
     * @param array Matriz con los datos a actualizar
     * @return boolean Devuelve true si todo salió bien y false si hubo error
     * @access public
     */
    function update($tabla='',$id=0,$datos=array()){
        if(is_array($datos) && $tabla != '' && $id != 0){
            $campos = '';
            foreach($datos as $key => $value){
                if($campos === '') $campos = $key.'= ?';
                else $campos .= ','.$key.'= ?';
            }
            $this->Execute('UPDATE '.$tabla.' SET '.$campos.' WHERE Id = '.$id,array_values($datos));
            if($this->Affected_Rows() > 0) return true;
            else return false;
        }
        else return false;
    }//FIN update

    /**
     * Función que elimina un registro de la base de datos, y optimiza la tabla
     * @param string Nombre de la tabla donde hay que eliminar el registro
     * @param int Id del registro a eliminar
     * @return boolean True si todo salió bien, false si hubo algún error
     * @access public
     */
    function del($tabla='',$id=0){
        if($tabla != '' && $id != 0){
            $this->Execute('DELETE FROM '.$tabla.' WHERE Id = ?',array($id));
            if($this->Affected_Rows() > 0){
                $this->Execute('OPTIMIZE TABLE '.$tabla);
                return true;
            }
            else return false;
        }
        else return false;
    }//FIN del

    /**
     * Función que indica si un cierto registro se encuentra en la base de datos
     * proporcionándole la tabla, el campo, el valor. Si el id también se le pasa
     * como parámetro ese registro es excluido
     * @param string Nombre de la tabla de la base de datos a comprobar
     * @param string Nombre del campo a comprobar
     * @param string Valor del campo a verificar si existe o no
     * @param int Id del registro que será excluido de la búsqueda
     * @return int Devuelve el número de veces que aparece el valor buscado en el
     * campo buscado, o false si no se encontró
     * @access public
     */
    function exist($tabla='',$campo='',$valor='',$id=0){
        if($tabla != '' && $campo != '' && $valor != ''){
            if($id == 0) $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE '.$campo.' = ?',array($valor));
            else  $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE '.$campo.' = ? AND Id != ?',array($valor,$id));
            if(is_object($rs) && $rs->RecordCount() > 0) return $rs->RecordCount();
            else return false;
        }
        else return false;
    }//FIN exist

    /**
     * Función que devuelve el número de registros en los que aparece cierto
     * valor en un campo de una tabla de una base de datos, o el número de registros
     * de una tabla
     * @param string Nombre de la tabla
     * @param string Campo a comprobar
     * @param string Valor del campo a comprobar
     * @return int Número de registros o false si hubo problemas o no se encontró
     * @access public
     */
    function num($tabla='',$campo='',$valor=''){
        if($tabla != ''){
            if($campo != '') $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE '.$campo.' = ?',array($valor));
            else $rs = $this->Execute('SELECT * FROM '.$tabla);

            if(is_object($rs) && $rs->RecordCount() > 0) return $rs->RecordCount();
            else return false;
        }
        else return false;
    }//FIN num

    /**
     * Función que devuelve un registro completo de la base de datos
     * @param string Nombre de la tabla donde voy a extraer el registro
     * @param int Id del registro a extraer
     * @param string Si quiero extraer el registro por otro campo diferente al id
     * entonces aquí indico que campo
     * @return array Matriz con todos los campos del registro
     * @access public
     */
    function get_one($tabla='',$id=0,$campo=''){
        if($tabla != '' && $campo == ''){
            $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE Id = ?',array($id));
            if(is_object($rs)) return $rs->fields;
            else return false;
        }
        else if($tabla != '' && $campo != ''){
            $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE '.$campo.' = ?',array($id));
            if(is_object($rs)) return $rs->fields;
            else return false;
        }
        else return false;
    }//FIN get_one

    /**
     * Función que obtiene todos los registros de una tabla ordenados por
     * un campo
     * @param string tabla Nombre de la tabla de la que vamos a extraer los registros
     * @param string campo Nombre del campo por el que vamos a ordenar los campos
     * @param string valor Valor que debe tener el campo
     * @param string orden Forma en que se van a ordenar los campos DESC o ASC
     * @return array Matriz multidimensional con todos los registros de la base
     * de datos
     * @access public
     */
    function get_all($tabla='',$campo='',$valor='',$orden='DESC'){
        if($tabla != ''){
            if ($campo != '' && $valor == '') $rs = $this->Execute('SELECT * FROM '.$tabla.' ORDER BY '.$campo.' '.$orden);
	    	else if ($campo != '' && $valor != '') $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE '.$campo.' = ? ORDER BY '.$campo.' '.$orden,array($valor));
            else $rs = $this->Execute('SELECT * FROM '.$tabla);
            if(is_object($rs)){
                $retorno = array();
                while(!$rs->EOF){
                    $id = $rs->fields['Id'];
                    $retorno[$id] = $rs->fields;
                    $rs->MoveNext();
                }
                return $retorno;
            }
            else return false;
        }
        else return false;
    }//FIN get_all

    /**
     * Función que obtiene todos los registros de una tabla ordenados por
     * un campo, pero limitados a un cierto número
     * @param string tabla Nombre de la tabla de la que vamos a extraer los registros
     * @param string campo Nombre del campo por el que vamos a ordenar los campos
	 * @param int limite Valor límite a obtener
	 * @param int inicio Valor de inicio de registros
	 * @param string orden Forma en que se van a ordenar los campos DESC o ASC
	 * @param string valor Si este campo tiene valor entonces se obtienen todos los campos que sean $campo = $valor
     * @return array Matriz multidimensional con todos los registros de la base
     * de datos
     * @access public
     */
    function get_limit($tabla='',$campo='',$limite=10,$inicio=0,$orden='DESC',$valor=''){
        if($tabla != ''){
            if ($campo != ''){
            	if($valor == '') $rs = $this->SelectLimit('SELECT * FROM '.$tabla.' ORDER BY '.$campo.' '.$orden,$limite,$inicio);
            	else $rs = $this->SelectLimit('SELECT * FROM '.$tabla.' WHERE '.$campo.' = \''.$valor.'\' ORDER BY '.$campo.' '.$orden,$limite,$inicio);
            }
            else $rs = $this->SelectLimit('SELECT * FROM '.$tabla.' '.$orden,$limite,$inicio);
            if(is_object($rs)){
                $retorno = array();
                while(!$rs->EOF){
                    $id = $rs->fields['Id'];
                    $retorno[$id] = $rs->fields;
                    $rs->MoveNext();
                }
                return $retorno;
            }
            else return false;
        }
        else return false;
    }//FIN get_limit

    /**
     * Función que realiza la busqueda de un cierto valor en todos los
     * registros de la base de datos dándole el campo y el valor a buscar
     * @param string tabla Nombre de la tabla donde buscar
     * @param string campo Campo donde buscar
     * @param string valor Valor a buscar
     * @param string ordenar Campo por el que se van a ordenar los registros
     * @param int limite Límite de registros a extraer
     * @param int inicio Valor de inicio de extracción de los registros
     * @param string Forma en que se van a ordenar los campos DESC o ASC
     * @return array Matriz con todos los resultados encontrados
     */
    function search($tabla='',$campo='',$valor='',$ordenar='',$limite=0,$inicio=0,$orden='DESC'){
        if($tabla != '' && $campo != '' && $valor != ''){
        	if($ordenar == '') $ordenar = $campo;
        	if($limite == 0){
	            if($orden == '') $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE '.$campo.' LIKE ? ORDER BY '.$campo,array('%'.$valor.'%'));
	            else $rs = $this->Execute('SELECT * FROM '.$tabla.' WHERE '.$campo.' LIKE ? ORDER BY '.$ordenar.' '.$orden,array('%'.$valor.'%'));
        	}
        	else{
	            if($orden == '') $rs = $this->SelectLimit('SELECT * FROM '.$tabla.' WHERE '.$campo.' LIKE ? ORDER BY '.$campo,$limite,$inicio,array('%'.$valor.'%'));
	            else $rs = $this->SelectLimit('SELECT * FROM '.$tabla.' WHERE '.$campo.' LIKE ? ORDER BY '.$ordenar.' '.$orden,$limite,$inicio,array('%'.$valor.'%'));
	       	}
            if(is_object($rs)){
                $retorno = array();
                while(!$rs->EOF){
                    $id = $rs->fields['Id'];
                    $retorno[$id] = $rs->fields;
                    $rs->MoveNext();
                }
                return $retorno;
            }
            else return false;
        }
        else return false;
    }//FIN search
}

eval('class base_resultset_EXTENDER extends ' . $last_module . '_ResultSet { }');

class base_ResultSet extends base_resultset_EXTENDER{
}
?>